package com.lovo.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.lovo.system.dto.PageDto;
import com.lovo.system.dto.SaleMesDto;
import com.lovo.system.service.ISaleMesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Properties;

@RestController
@RequestMapping("/saleMes")
public class SaleMesController {

    @Autowired
    ISaleMesService saleMesService;

    @RequestMapping("/info")
    public IPage<SaleMesDto> info(@RequestBody PageDto<SaleMesDto> pageDto) {
        return saleMesService.info(pageDto.getCurPage(), pageDto.getPageSize(), pageDto.getStartTime(),
                pageDto.getEndTime(), pageDto.getData().getCustomerName());
    }

    @RequestMapping("/add")
    public int addSaleMes(@RequestBody SaleMesDto saleMesDto) {
        try {
            saleMesDto.setSaleDate(LocalDate.now());
            return saleMesService.insertSaleMes(saleMesDto);
        } catch (Exception e) {
            return 0;
        }
    }

    //发件人的邮箱和密码
    public static String myEmailAccount = "1170579552@qq.com";
    public static String myEmailPassword = "qseojsuxqbnxhbgj";

    //发件人邮箱的 SMTP服务器地址
    public static String myEmailSMTPHost = "smtp.qq.com";

    // 收件人邮箱
    public static String receiveMailAccount = "1204398671@qq.com";

    @RequestMapping("/sendEmail")
    @Scheduled(cron="00 00 12 * * ?")//每天12点执行一次
    public void sendEmail() throws Exception {
        //1.创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    //参数配置
        props.setProperty("mail.transport.protocol", "smtp");   //使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   //发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            //需要请求认证

        // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
        //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
        //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
        final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        //2.根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);

        //3.创建一封邮件
        MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);

        //4.根据Session获取邮件传输对象
        Transport transport = session.getTransport();

        // 5.使用邮箱账号和密码连接邮件服务器, 这里认证的邮箱必须与 message中的发件人邮箱一致,否则报错
        transport.connect(myEmailAccount, myEmailPassword);

        //6.发送邮件,发到所有的收件地址,message.getAllRecipients()获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());
        System.out.println("邮件发送成功");

        // 7. 关闭连接
        transport.close();
    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session     和服务器交互的会话
     * @param sendMail    发件人邮箱
     * @param receiveMail 收件人邮箱
     * @return
     * @throws Exception
     */
    public MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {
        // 1.创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 2.From:发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, "小谭邮件", "UTF-8"));
        // 3.To:收件人（可以增加多个收件人、抄送、密送）
        /*message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "我的用户们", "UTF-8"));*/
        List<String> email = saleMesService.selectEmail(saleMesService.selectCustomer());
        message.setRecipients(MimeMessage.RecipientType.TO,getInternetAddress(email));
        // 4.Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject("免费给你们送游戏", "UTF-8");
        // 5.Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        message.setContent("白嫖老头环，只限今天！！！", "text/html;charset=UTF-8");
        // 6.设置发件时间
        message.setSentDate(new Date());
        // 7.保存设置
        message.saveChanges();
        return message;
    }

    public InternetAddress[] getInternetAddress(List<String> mailList) throws AddressException {
        int length = mailList.size();
        if (length == 0) {
            return null;
        }
        InternetAddress[] internetAddresses = new InternetAddress[length];
        for (int i = 0; i < length; i++) {
            internetAddresses[i]=new InternetAddress(mailList.get(i));
        }
        return internetAddresses;
    }
}
